home *** CD-ROM | disk | FTP | other *** search
/ BBS in a Box 7 / BBS in a Box - Macintosh - Volume VII (BBS in a Box) (January 1993).iso / Files / Tele / C / Comet2.1.3.cpt / 3270XCMD / TNOpen.c < prev    next >
Text File  |  1989-08-30  |  6KB  |  259 lines

  1. /* TNOpen.c -- XCMD to open the TN3270 driver 
  2.     copyright 1989 Cornell University 
  3. */
  4.  
  5.  
  6. #include <Types.h>
  7. #include <Memory.h>
  8. #include <Devices.h>
  9. #include <HyperXCmd.h>
  10. #include <Errors.h>
  11.  
  12. #include <String.h>
  13.  
  14. #include "TNdrvr.h"
  15.  
  16.  
  17. pascal void debugger()    extern 0xA9FF;   
  18.  
  19.  
  20. pascal void TNOpen(hycp)
  21. XCmdPtr hycp;
  22. {
  23.     CntrlParam drvpb;
  24.     long * args;
  25.     char istr[80];        /* for converting int to str */
  26.     int istrlen;
  27.     Str255 retstr;
  28.     Handle strhand;
  29.     OSErr result;
  30.     
  31.     if (hycp->paramCount != 4) {
  32.         sethand(&hycp->returnValue, 
  33.             "TNOpen TNID,TNscreen,TNcursor,TNfield: need 4 globals as arguments, all quoted");
  34.         return;
  35.     }
  36.     
  37.     drvpb.ioNamePtr = "\p.TNdrvr";
  38.     drvpb.csCode = fsCurPerm;                    /* same as permissions */
  39.     PBOpen((ParmBlkPtr) &drvpb, (Boolean) 0);
  40.  
  41.     if (drvpb.ioResult) {
  42.         /* can't open the TNdrvr */
  43.         sethand(&hycp->returnValue, "Can't open .TNdrvr");
  44.         return;
  45.     }
  46.     
  47.     istrlen = shorttostr(&istr[0], drvpb.ioCRefNum);
  48.     if (PtrToHand(&istr[0], &strhand, (Size) (istrlen + 1))) {
  49.         sethand(&hycp->returnValue, "Out of memory");
  50.         return;
  51.     }
  52.     HLock((Handle) hycp->params[0]);
  53.     ZeroToPas(hycp, (char *) *hycp->params[0], &retstr[0]);
  54.     SetGlobal(hycp, &retstr[0], strhand);
  55.     if (hycp->result) {
  56.         sethand(&hycp->returnValue, "Can't set TNID");
  57.         return;
  58.     }
  59.     DisposHandle(strhand);
  60.     HUnlock((Handle) hycp->params[0]);
  61.         
  62.     drvpb.csCode = HTN_OPEN;
  63.     args = (long *) &drvpb.csParam[0];
  64.  
  65. #ifdef PASSARG
  66.     *args = (long) hycp->params[1];
  67.         /* pass the "data ready" Handle to the drvr to pass on to TN3270 */
  68. #endif
  69.  
  70.     PBControl((ParmBlkPtr) &drvpb, (Boolean) 0);
  71.  
  72.     if (drvpb.ioResult) {
  73.         /* open failed */
  74.         switch (drvpb.ioResult) {
  75.             case HTNR_NOTN: {
  76.                 sethand(&hycp->returnValue, "TN is not running");
  77.                 return;
  78.             }
  79.             case HTNR_ACTIVE: {
  80.                 sethand(&hycp->returnValue, "TN already open");
  81.                 break;
  82.             }
  83.             case HTNR_OPEN: {
  84.                 sethand(&hycp->returnValue, "TN already has a connection");
  85.                 return;
  86.             }
  87.             case badUnitErr: {
  88.                 sethand(&hycp->returnValue, "TNID is incorrect");
  89.                 return;
  90.             }
  91.             default: {
  92.                 sethand(&hycp->returnValue, "Unknown error");
  93.                 return;
  94.             }
  95.         }
  96.     }
  97.     /* on return first long arg set to address of screen buffer */
  98.     istrlen = ulongtostr(&istr[0], *args);
  99.     if (PtrToHand(&istr[0], &strhand, (Size) (istrlen + 1))) {
  100.         sethand(&hycp->returnValue, "Out of memory");
  101.         return;
  102.     }
  103.     HLock((Handle) hycp->params[1]);
  104.     ZeroToPas(hycp, (char *) *hycp->params[1], &retstr[0]);
  105.     SetGlobal(hycp, &retstr[0], strhand);
  106.     if (hycp->result) {
  107.         sethand(&hycp->returnValue, "Can't set TNscreen");
  108.         return;
  109.     }
  110.     DisposHandle(strhand);
  111.     HUnlock((Handle) hycp->params[1]);
  112.  
  113.     /* on return second long arg set to address of cursor ptr */
  114.     istrlen = ulongtostr(&istr[0], *++args);
  115.     if (PtrToHand(&istr[0], &strhand, (Size) (istrlen + 1))) {
  116.         sethand(&hycp->returnValue, "Out of memory");
  117.         return;
  118.     }
  119.     HLock((Handle) hycp->params[2]);
  120.     ZeroToPas(hycp, (char *) *hycp->params[2], &retstr[0]);
  121.     SetGlobal(hycp, &retstr[0], strhand);
  122.     if (hycp->result) {
  123.         sethand(&hycp->returnValue, "Can't set TNcursor");
  124.         return;
  125.     }
  126.     DisposHandle(strhand);
  127.     HUnlock((Handle) hycp->params[2]);
  128.  
  129.     /* on return third long arg set to address of field ptr */
  130.     istrlen = ulongtostr(&istr[0], *++args);
  131.     if (PtrToHand(&istr[0], &strhand, (Size) (istrlen + 1))) {
  132.         sethand(&hycp->returnValue, "Out of memory");
  133.         return;
  134.     }
  135.     HLock((Handle) hycp->params[3]);
  136.     ZeroToPas(hycp, (char *) *hycp->params[3], &retstr[0]);
  137.     SetGlobal(hycp, &retstr[0], strhand);
  138.     if (hycp->result) {
  139.         sethand(&hycp->returnValue, "Can't set TNfield");
  140.         return;
  141.     }
  142.     DisposHandle(strhand);
  143.     HUnlock((Handle) hycp->params[3]);
  144.  
  145.     return;
  146. }
  147.  
  148.  
  149. sethand(thand, str)
  150. Handle * thand;
  151. char * str;
  152. {
  153.     if (*thand == NULL) {
  154.         *thand = NewHandle((Size) 0);
  155.     }
  156.     SetHandleSize(*thand, (long) (strlen(str) + 1));
  157.     strcpy(**thand, str);
  158. }
  159.  
  160.  
  161. /* convert a short to a string, returning the length */
  162.  
  163. shorttostr(strp, thenum)
  164. char * strp;
  165. short thenum;
  166. {
  167.     char tarr[80];
  168.     char * tarrp = &tarr[0];
  169.     char * strstart = strp;
  170.     
  171.     if (thenum == 0) {
  172.         /* handle zero as special case */
  173.         *strp++ = '0';
  174.         *strp = 0;
  175.         return(1);
  176.     }
  177.     if (thenum < 0) {
  178.         /* put in the minus sign for negative numbers */
  179.         *strp++ = '-';
  180.         thenum = -thenum;
  181.     }
  182.     *tarrp++ = 0;        /* pre-terminate the backwards char array */
  183.     while (thenum) {
  184.         /* put the fractions into an array as decimal characters */
  185.         *tarrp++ = (thenum % 10) + '0';
  186.         thenum /= 10;
  187.     }
  188.     /* now read the array backwards into the arg */
  189.     while (*--tarrp) {
  190.         *strp++ = *tarrp;
  191.     }
  192.     *strp = 0;            /* terminate the arg array */
  193.     return(strp - strstart);    /* and return the length */
  194. }
  195.  
  196.  
  197. /* convert a long to a string, returning the length */
  198.  
  199. ulongtostr(strp, thenum)
  200. char * strp;
  201. long thenum;
  202. {
  203.     char tarr[80];
  204.     char * tarrp = &tarr[0];
  205.     char * strstart = strp;
  206.     
  207.     if (thenum == 0) {
  208.         /* handle zero as special case */
  209.         *strp++ = '0';
  210.         *strp = 0;
  211.         return(1);
  212.     }
  213.     if (thenum < 0) {
  214.         /* put in the minus sign for negative numbers */
  215.         *strp++ = '-';
  216.         thenum = -thenum;
  217.     }
  218.     *tarrp++ = 0;        /* pre-terminate the backwards char array */
  219.     while (thenum) {
  220.         /* put the fractions into an array as decimal characters */
  221.         *tarrp++ = (thenum % 10) + '0';
  222.         thenum /= 10;
  223.     }
  224.     /* now read the array backwards into the arg */
  225.     while (*--tarrp) {
  226.         *strp++ = *tarrp;
  227.     }
  228.     *strp = 0;            /* terminate the arg array */
  229.     return(strp - strstart);    /* and return the length */
  230. }
  231.  
  232.  
  233. /* from xcmd.inc.c */
  234.  
  235. pascal void SetGlobal(paramPtr,globName,globValue)
  236.     XCmdPtr    paramPtr;    StringPtr    globName;    Handle    globValue;
  237. /* Set the value of the specified HyperTalk global variable to be
  238.    the zero-terminated string in globValue.  The contents of the 
  239.    Handle are copied, so you must still dispose it afterwards.  */
  240. {
  241.     paramPtr->inArgs[0] = (long)globName;
  242.     paramPtr->inArgs[1] = (long)globValue;
  243.     paramPtr->request = xreqSetGlobal;
  244.     (paramPtr->entryPoint)();
  245. }
  246.  
  247. pascal void ZeroToPas(paramPtr,zeroStr,pasStr)
  248.     XCmdPtr    paramPtr;    char    *zeroStr;    StringPtr    pasStr;
  249. /* Fill the Pascal string with the contents of the zero-terminated
  250.    string.  You create the Pascal string and pass it in as a VAR 
  251.    parameter.  Useful for converting the arguments of any XCMD to 
  252.    Pascal strings. */
  253. {
  254.     paramPtr->inArgs[0] = (long)zeroStr;
  255.     paramPtr->inArgs[1] = (long)pasStr;
  256.     paramPtr->request = xreqZeroToPas;
  257.     ((paramPtr->entryPoint))();
  258. }
  259.